/**
* Fichero que incluye las funciones y los ficheros de cabecera
* necesarios para el uso completo del middleware de coordinacion.
* Se incluyen la variable global "event_handler". Mediante ella, 
* se podran registrar objetos en el manejador de eventos, asi como enviar 
* y recibir eventos distribuidos.
*
* @author Carlos Rodriguez Dominguez
* @date 25/11/2008
*/

#ifndef _COLLABORATION_SUBSYSTEM_H_
#define _COLLABORATION_SUBSYSTEM_H_

#include "collaboration.h"
#include "eventHandler.h"  //Definicion de EventHandler
#include "listeningObject.h" //Deficion de objetos que aceptan eventos distribuidos
#include "event.h" //modelado de eventos distribuidos
#include "eventListener.h" //listener de eventos distribuidos. Cada ListeningObject tendra varios
#include "drawingEvent.h" //modelado de eventos de dibujo
#include "drawingListener.h" //listener para eventos de dibujo
#include "pairEvent.h" //eventos asociados a parejas de datos en coma flotante
#include "Thread.h" //wrapper para la hebras

namespace Collaboration{
	
	extern EventHandler* EVENT_HANDLER; /**< Manejador de eventos usado globalmente */

	/**
	* Inicializa el middleware de coordinacion. Una vez inicializado,
	* se podra hacer uso adecuadamente de la variable compartida "event_handler"
	*
	* @return True si se inicializo con exito el middleware. False
	*         en caso contrario.
	*
	* @post El middleware de coordinacion quedara inicializado y la variable global
	*       "event_handler" se inicializara debidamente.
	*/
	bool initCoordinationMiddleware();
	bool initCoordinationMiddleware(const std::string& host);
	
	/**
	* Apaga el middleware de coordinacion y destruye la variable compartida
	* "event_handler". Si no se ha llamado a la funcion 
	* @see setup_environment entonces el comportamiento
	* es totalmente inesperado.
	*
	* @pre Se debe haber llamado a la funcion @see setup_environment
	* @post El middleware de coordinacion se apagara y la variable compartida "event_handler"
	*       sera destruida.
	*/
	void shutdownCoordinationMiddleware();
}

#endif
